package com.robertux.leaderboard.util;

import java.util.Arrays;
import java.util.List;

import com.robertux.leaderboard.beans.entities.DetalleGrupoProducto;
import com.robertux.leaderboard.beans.entities.GrupoProducto;
import com.robertux.leaderboard.util.gestoresModelos.GestorGruposProductos;

public class ProductsFileContentHandler extends FileContentHandler {
	private GestorGruposProductos gGprds;
	private GrupoProducto gPrd;

	public ProductsFileContentHandler(GrupoProducto gPrd) {
		super("/Leaderboard/admin/adminGruposProductos.html", 
				new String[]{"Codigo Producto", "Cantidad", "No utilizar esta columna"});
		
		this.gGprds = new GestorGruposProductos();
		this.gPrd = gPrd;
	}

	@Override
	public String[] handleFileContent(String[][] fileContent, String[] discardedRows, String[] mappedColumns) {
		String[] results = new String[fileContent.length];
		
		for(DetalleGrupoProducto detGPrd: this.gPrd.getDetalleGrupoProductos()) {
			this.gGprds.eliminarDetalleProducto(detGPrd);
		}
		this.gPrd.getDetalleGrupoProductos().clear();
		this.gGprds.actualizarGrupoProducto(this.gPrd);
		
		List<String> lstDiscardedRows = Arrays.asList(discardedRows);
		
		for(int i=0; i<fileContent.length; i++) {
			String result = "";
			if(!lstDiscardedRows.contains(String.valueOf(i))) {
				try {
					DetalleGrupoProducto prd = this.createProducto(fileContent[i], mappedColumns);
					if(prd != null) {
						this.gPrd.addDetalleGrupoProducto(prd);
						result = "OK - Producto agregado satisfactoriamente al grupo " + this.gPrd.getNombre();
					} else {
						result = "ERROR - No se pudo agregar el producto a partir de los datos ingresados";
					}
				} catch (Exception e) {
					this.logger.error("Error tratando de construir producto con las columnas " + Arrays.toString(fileContent[i]) + ": " + e.getMessage(), e);
					result = "ERROR - Error tratando de agregar el producto: " + e.getMessage();
				}
			}
			results[i] = result;
		}
		
		this.gGprds.actualizarGrupoProducto(this.gPrd);
		return results;
	}
	
	private DetalleGrupoProducto createProducto(String[] contentRow, String[] mappedColumns) {
		DetalleGrupoProducto prd = new DetalleGrupoProducto();
		prd.setCantidad(1);
		List<String> lstColumns = Arrays.asList(mappedColumns);
		int index = 0;
		
		index = lstColumns.indexOf("Codigo Producto");
		if(index >= 0 && index < contentRow.length) {
			prd.setProductoId(contentRow[index]); 
		}
		
		index = lstColumns.indexOf("Cantidad");
		if(index >= 0 && index < contentRow.length) {
			prd.setCantidad(Integer.parseInt(contentRow[index]));
		}
		
		this.logger.debug("Producto construido: " + prd);
		return prd;
	}

}
